home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 16
/
AMIGAplus Sonderheft 16 (1998)(ICP)(DE)[!].iso
/
pd
/
anwendungen
/
xpk_source
/
libraries
/
fast
/
decompress.a
< prev
next >
Wrap
Text File
|
1998-08-27
|
3KB
|
120 lines
;;;
;;; Remarks
;;; =======
;;;
;;; * This code relies on XPK_MARGIN being >= 32 !!!
;;; If only one Bit in the last ControlWord is used, the remaining 15
;;; will be filled with 0. This will result in 15 LiteralItems on
;;; decompression. In Addition to this there is NO CHECK, if a match
;;; matches more than the input. This can result in a match which is
;;; 17 Bytes to long giving a maximum total of 32 Bytes garbled after
;;; the outputblock after decompresion.
;;; (XPK_MARGIN is 256 in xpkmaster.library V2.0)
;;;
; XDEF decompress
; ;Register Map
; ;============
; a0 Points to next source byte.
; a1 Points to next destination byte.
; a2 Temporary.
; a3 Unused.
; a4 Pointer for the input word stream.
; a5 Unused.
; a6 Stackframe linkage register. Don't touch!
; a7 Stack pointer.
; d0 Length of the compressed.
; d1 control Word
; d2 Counter for halfunrolled decompress_16_items_loop.
; d3 Temporary used to calculate copy item length.
; d4 Temporary used to calculate copy item offset.
; d5 Unused.
; d6 Unused.
; d7 Unused.
;;;---------------------------------------------------------------------------
decompress:
movem.l a0-a2/a4-a5/d1-d5,-(sp)
move.l d0,a4
add.l a0,a4 ;a4:=behind the end of input block
moveq.l #0,d4 ;d4:=0
;;;---------------------------------------------------------------------------
DOCOPY MACRO
move.w -(a4),d4 ;Grab the copy item description
moveq #$0F,d3
and.b d4,d3 ;extract length.
add.b d3,d3 ;adjust length to length*2
lsr.w #4,d4 ;extract offset
move.l a1,a2 ;Subtract the offset yielding the
suba.l d4,a2 ;address from which we copy.
jmp MOVE\@(PC,d3.w) ;jump to the right place
MOVE\@ move.b (a2)+,(a1)+ ;0
move.b (a2)+,(a1)+ ;1
move.b (a2)+,(a1)+ ;2
move.b (a2)+,(a1)+ ;3
move.b (a2)+,(a1)+ ;4
move.b (a2)+,(a1)+ ;5
move.b (a2)+,(a1)+ ;6
move.b (a2)+,(a1)+ ;7
move.b (a2)+,(a1)+ ;8
move.b (a2)+,(a1)+ ;9
move.b (a2)+,(a1)+ ;10
move.b (a2)+,(a1)+ ;11
move.b (a2)+,(a1)+ ;12
move.b (a2)+,(a1)+ ;13
move.b (a2)+,(a1)+ ;14
move.b (a2)+,(a1)+ ;15
move.b (a2)+,(a1)+
move.b (a2)+,(a1)+
ENDM
DOLITERAL MACRO
move.b (a0)+,(a1)+ ;Literal item means copy a byte.
ENDM
;This loop processes one 16-item item group per iteration.
;This loop terminates when we definitely have decompressed all
;16-item blocks. It may overwrite 15+17 innocent bytes AFTER the
;end of outbuf.
move.w #$8000,d1
add.w d1,d1
oloop: move.w -(a4),d1
addx.w d1,d1
bcs.s Copy0
Lit0: DOLITERAL
add.w d1,d1
bcc.W Lit1
Copy1: DOCOPY
add.w d1,d1
bcc.s Lit0
bne.s Copy0
cmp.l a4,a0
bcc.s finish
move.w -(a4),d1
addx.w d1,d1
bcc.s Lit0
Copy0: DOCOPY
add.w d1,d1
bcs.s Copy1
Lit1: DOLITERAL
add.w d1,d1
bcc.W Lit0
bne.s Copy0
cmp.l a4,a0
bcs.W oloop
finish: movem.l (sp)+,a0-a2/a4-a5/d1-d5
rts